/*
题目描述：计算一个整数二进制中的 1 的个数
方法：
1. 与 flag进行与运算，flag初始为 1， 每次运算过后，flag左移一位，移动次数为整数位数 - 1
2. 将整数减 1 再与原数进行与运算，可以将原数最右边的 1 变为 0
e.g. 1100 & 1011 = 1000
     1010 & 1001 = 1000
     1001 & 1000 = 1000
     1000 & 0100 = 0000

注意：在使用第一种方法，n为负数用补码表示的时候，第一种方法会出现问题，flag需要使用unsigned，但是Java并不支持unsigned这种语法
第二种方法通用，并且需要比较的次数为该数中 1 的个数
 */
public class E15 {
    public static void main(String[] args){
//        int n = -2147483648;
//        int n = -2;
        int n = 78;
        System.out.println(numberOf1_1(n));
        System.out.println(numberOf1_2(n));
    }

    public static int numberOf1_1(int n){
        int  flag = 1;//Attention!!!!
        int res = 0;
        while(flag != 0){
            if((n & flag) > 0){
                res ++;
            }
            flag <<= 1;
        }
        return res;
    }

    public static int numberOf1_2(int n){
        int res = 0;
        while(n != 0){
            n = n & (n - 1);
            res ++;
        }
        return res;
    }
}
